package com.huatai.dataservice.panel.common.utils;

/**
 * @Name ：CourseUtils
 * @Description ：经纬度计算工具
 * @Author ：hui.ma
 * @Date ：2022/9/16 下午 6:50
 * @Version ：1.0.0$
 * @History ：
 */
import static java.lang.Math.PI;

public class CourseUtils {

    public static String calcAngle(Double centerLat, Double centerLon, Double anotherLat, Double anotherLon) {
        //差值
        double subLat = anotherLat - centerLat;
        double subLon = anotherLon - centerLon;
        double angle = 0;

        if (subLat == 0) {
            //纬度差值为0 表示两点在同一高度 此时点必然在x轴右侧 或者 x轴左侧
            if (subLon > 0) {
                //x轴右侧
                angle = 0;
            } else if (subLon < 0) {
                //x轴左侧
                angle = 180;
            }
        } else if (subLon == 0) {
            //经度差值为0 说明点在y轴上方或者y轴下方
            if (subLat > 0) {
                //y轴上方
                angle = 270;
            } else if (subLat < 0) {
                //y轴下方
                angle = 90;
            }
        } else {
            //根据tan的值，求角度 subLon不能为0  纬度差值 除以 经度差值 = tan的值
            double v = subLat / subLon;
            angle = Math.atan(v) * 180 / PI;
            System.out.println("未处理的角度值:" + (angle));
            //第二种求角度的方法
            //angle = Math.atan2(subLat,subLon) * 180 / PI  ;
            //判断数据在第几象限
            //1、角度小于0 说明another点在二四象限（直角坐标系的右下角或者左上角）
            if (angle < 0) {
                if (subLon >= 0) {
                    //此时的点在中心点的右下角 取绝对值
                    angle = Math.abs(angle);
                } else if (subLon < 0) {
                    //此时的点在中心点的左上角 取绝对值 再加180
                    angle = Math.abs(angle) + 180;
                }
            }
            //2、角度大于0 说明another点在一三象限（直角坐标系的右上角或者左下角）
            else if (angle > 0) {
                if (subLat > 0) {
                    //此时的点在中心点的右上角  360-angle
                    angle = 360 - angle;
                } else if (subLat < 0) {
                    // 此时的点在中心点的左下角
                    angle += 90;
                }
            }
        }
        return String.valueOf(angle);
    }
}
